/**
 * 使用方法   在table的 thead 的 tr 添加sorter=true，并且制定 type=XX类型
 * @param {Object} params
 */
$.fn.TableSort = function(params) {
	let options = {
		Icon: true
	};
	options = $.extend(options, params);

	//获取表格对象
	let $Table = $(this);
	//获取table对象下的thead  
	let tbHead = $Table.children('thead');
	//获取thead下的tr下的th  
	let tbHeadTh = tbHead.find('tr th');
	//获取table对象下的tbody  
	let tbBody = $Table.children('tbody');
	//获取tbody下的tr  
	let tbBodyTr = tbBody.find('tr');

	let sortIndex = -1;

	//遍历thead的tr下的th  
	tbHeadTh.each(function() {
		//加上排序图标
		if(options.Icon == true && $(this).attr("sorter") == "true") {
			$(this).append("&nbsp;<img class='sortIcon' src='StaticResource/Plugins/TableSort/sortIcon.png' />");
		}

		let thisIndex = tbHeadTh.index($(this)); //获取th所在的列号  
		//给th增加鼠标位于上方时发生的事件  
		$(this).mouseover(function() {
			$(this).addClass("hover")
		}).mouseout(function() { //给表头th增加鼠标离开时的事件  
			$(this).removeClass("hover")
		});

		//给当前表头th增加点击事件  
		$(this).click(function() {
			let dataType = $(this).attr("type"); //点击时获取当前th的type属性值  
			if($(this).attr("sorter")) {
				tablesort(thisIndex, dataType);
			}
		});

		//对表格排序  
		function tablesort(index, type) {
			let trsValue = new Array();

			tbBodyTr.each(function() {
				let tds = $(this).find('td');
				//获取行号为index列的某一行的单元格内容与该单元格所在行的行内容添加到数组trsValue中  
				trsValue.push(type + ".separator" + $(tds[index]).html() + ".separator" + $(this).html());
				$(this).html("");
			});

			let len = trsValue.length;

			if(index == sortIndex) {
				//如果已经排序了则直接倒序  
				trsValue.reverse();
			} else {
				for(let i = 0; i < len; i++) {
					//split() 方法用于把一个字符串分割成字符串数组  
					//获取每行分割后数组的第一个值,即此列的数组类型,定义了字符串\数字\Ip  
					type = trsValue[i].split(".separator")[0];
					for(let j = i + 1; j < len; j++) {
						//获取每行分割后数组的第二个值,即文本值  
						value1 = trsValue[i].split(".separator")[1];
						//获取下一行分割后数组的第二个值,即文本值  
						value2 = trsValue[j].split(".separator")[1];
						//接下来是数字\字符串等的比较  
						if(type == "number") {
							value1 = value1 == "" ? 0 : value1;
							value2 = value2 == "" ? 0 : value2;
							if(parseFloat(value1) > parseFloat(value2)) {
								let temp = trsValue[j];
								trsValue[j] = trsValue[i];
								trsValue[i] = temp;
							}
						} else if(type == "datetime") {
							value1 = new Date(value1.replace(/\-/g, "\/"));
							value2 = new Date(value2.replace(/\-/g, "\/"));
							if(value1 > value2) {
								let temp = trsValue[j];
								trsValue[j] = trsValue[i];
								trsValue[i] = temp;
							}
						} else {
							//该方法不兼容谷歌浏览器  
							if(value1.localeCompare(value2) > 0) {
								let temp = trsValue[j];
								trsValue[j] = trsValue[i];
								trsValue[i] = temp;
							}
						}
					}
				}
			}

			for(let i = 0; i < len; i++) {
				$("tbody tr:eq(" + i + ")").html(trsValue[i].split(".separator")[2]);
			}

			sortIndex = index;
		}
	});
}